#!/bin/bash
# 智能文件清理工具 - 按时间顺序删除文件直到释放指定容量（多目录版本）

# 基础配置（可通过环境变量覆盖）
DEFAULT_TARGET_GB=${CLEANER_DEFAULT_GB:-750}  # 默认清理目标（GB）
BASE_DIR=${CLEANER_BASE_DIR:-"/disk"}          # 监控根目录
TEMP_FILE=$(mktemp /tmp/cleaner.XXXXXX)       # 临时索引文件

usage() {
  echo "Usage: $0 [-s SIZE_GB] [-h]"
  echo "Options:"
  echo "  -s SIZE_GB   设置需要清理的空间大小（GB），默认 ${DEFAULT_TARGET_GB}G"
  echo "  -h           显示帮助信息"
  echo "Environment:"
  echo "  CLEANER_DEFAULT_GB  设置默认清理大小"
  echo "  CLEANER_BASE_DIR    设置监控根目录"
  exit 0
}

# 参数解析
while getopts ":s:h" opt; do
  case $opt in
    s) TARGET_GB="$OPTARG" ;;
    h) usage ;;
    \?) echo "无效选项: -$OPTARG" >&2; exit 1 ;;
    :) echo "选项 -$OPTARG 需要参数" >&2; exit 1 ;;
  esac
done

# 参数验证
TARGET_GB=${TARGET_GB:-$DEFAULT_TARGET_GB}
if ! [[ "$TARGET_GB" =~ ^[0-9]+$ ]]; then
  echo "错误：清理大小必须为整数" >&2
  exit 1
fi
if (( TARGET_GB <= 0 )); then
  echo "错误：清理大小必须大于0" >&2
  exit 1
fi

# 计算字节值（兼容macOS的bash）
TARGET_SIZE=$(( TARGET_GB * 1024 * 1024 * 1024 ))

# 查找所有符合条件的cache-bcdn目录
echo "正在扫描目标目录..."
find "${BASE_DIR}" -type d -path "*/cache-bcdn/*/bdlog/BaiduYunKernel/.accelerate" > "${TEMP_FILE}.dirs"

total_dirs=$(wc -l < "${TEMP_FILE}.dirs")
if (( total_dirs == 0 )); then
  echo "未找到任何符合条件的cache-bcdn目录"
  rm -f "${TEMP_FILE}.dirs"
  exit 1
fi

# 计算每个目录需要清理的大小
PER_DIR_TARGET=$(( TARGET_SIZE / total_dirs ))
echo "找到 ${total_dirs} 个cache-bcdn目录，每个目录目标清理: $(numfmt --to=iec $PER_DIR_TARGET)"

# 初始化统计变量
global_deleted=0
global_file_count=0
start_time=$(date +%s)

# 处理每个目录
while IFS= read -r target_dir; do
  echo "处理目录: ${target_dir}"
  
  # 生成当前目录的文件列表（按修改时间升序）
  find "${target_dir}" -type f -printf "%T@ %s %p\0" 2>/dev/null | sort -zn > "${TEMP_FILE}"
  
  # 当前目录统计
  dir_deleted=0
  dir_file_count=0
  
  # 执行清理操作
  while IFS= read -r -d '' line; do
    # 达到当前目录目标则退出循环
    (( dir_deleted >= PER_DIR_TARGET )) && break
    
    # 解析文件信息（时间戳|大小|路径）
    read -r timestamp filesize filename <<< "$line"
    
    # 执行删除
    if rm -f "$filename"; then
      ((dir_deleted += filesize))
      ((dir_file_count++))
      ((global_deleted += filesize))
      ((global_file_count++))
      echo "[DELETED] ${filename} ($(numfmt --to=iec $filesize))"
    else
      echo "[FAILED]  ${filename}" >&2
    fi
  done < "${TEMP_FILE}"
  
  echo "当前目录完成: 删除 ${dir_file_count} 文件，释放 $(numfmt --to=iec $dir_deleted)"
  rm -f "${TEMP_FILE}"
done < "${TEMP_FILE}.dirs"

# 性能统计
end_time=$(date +%s)
duration=$((end_time - start_time))

# 清理临时文件
rm -f "${TEMP_FILE}" "${TEMP_FILE}.dirs"

# 结果输出
echo "======================================"
echo "操作完成："
echo "扫描目录数     : ${total_dirs}"
echo "删除文件总数   : ${global_file_count}"
echo "释放空间       : $(numfmt --to=iec --format "%.2f" $global_deleted)"
echo "目标空间       : ${TARGET_GB}GB"
echo "实际完成度     : $(( global_deleted * 100 / TARGET_SIZE ))%"
echo "耗时           : ${duration}秒"
echo "处理速度       : $(numfmt --to=iec --format "%8.2f" $((global_deleted/duration)))B/s"

# 执行完自动重启
echo "清理完成，系统将在 1 分钟后重启..."
sleep 60
/sbin/reboot